![S3のGUIクライアントを利用するのに必要なIAM Policy](https://devio2023-media.developers.io/wp-content/uploads/2014/05/Amazon_S3.png)
S3のGUIクライアントを利用するのに必要なIAM Policy
こんにちは。望月です。
今日はS3とIAM Policyについて、小ネタを書いておきます。
S3を利用するためのIAM Policy
S3にはManagement Consoleの他にもCyberduckやCloudBerry Explorer等、様々なGUIクライアントが存在します。
当社の標準では、「アカウントのrootユーザ(アカウントが発行された後すぐに利用できるユーザ)は絶対に使用せず、ユーザ毎にIAM Userを作成する」というのが標準になっているので、用途ごとにIAM User(or IAM Role)を発行して、必要な権限を割り当てていくことになります。
その中でよくお客様から上がる要望の中に、「S3の特定のバケットのみを操作できるユーザで、S3をGUIクライアントから操作したい」というものがあります。その時にまず最初に思いつくのは、以下のようなPolicyです。
{ "Statement": [ { "Sid": "Stmt1403253384062", "Action": "s3:*", "Effect": "Allow", "Resource": "arn:aws:s3:::sample-bucket/*" } ] }
上の例では、sample-bucketという名前のバケットに対して、全ての処理を実行できる権限を与えています。
では、この権現を設定したIAM Userのアクセスキーを利用して、CloudBerry Explorerで接続してみましょう。
画面右側にバケットが表示されるはずなのですが、表示されません。空白のままです。
同様にCyberduckからも接続してみます。
Cyberduckではエラーが表示されましたね。「ディレクトリ一覧取得に失敗しました」と表示されています。
原因と対策
CloudBerry ExplorerやCyberduckでは、アプリケーションを開始した時に「存在するS3のバケットの一覧を取得」しようとします。ですが、先ほど書いたIAM Policyでは、「特定のバケットに対する処理」のみが許可されているため、全バケットに対する処理が許可されていません。そのためバケット一覧を取得することができず、エラーとなっていました。
そのため、「存在するS3バケットの一覧を取得」するAPIを叩くための権限が必要になります。そのAPIは「ListAllMyBuckets」です。それに加えて、バケットの所属リージョンを取得する「GetBucketLocation」APIを叩く権限も必要になってきます。ですので、先ほどのIAM Policyを以下のようなIAM Policyに修正してあげましょう。
{ "Statement": [ { "Sid": "Stmt1403255679880", "Action": [ "s3:GetBucketLocation", "s3:ListAllMyBuckets" ], "Effect": "Allow", "Resource": "arn:aws:s3:::*" }, { "Sid": "Stmt1403255696694", "Action": "s3:*", "Effect": "Allow", "Resource": [ "arn:aws:s3:::sample-bucket", "arn:aws:s3:::sample-bucket/*" ] } ] }
S3全体に対して「ListAllMyBuckets」と「GetBucketLocation」を許可しました。これによりある特定のバケットだけではなく、全バケットの一覧を取得することができるようになるため、以下の様にCyberduckから閲覧することができるようになります。
また、2つ目のStatementに"arn:aws:s3:::sample-bucket"と"arn:aws:s3:::sample-bucket/*"の2つを記述してあります。この2つの違いに最初悩んだのですが、どうやら1つ目が「sample-bucketに対する処理(例: ListBucket)」で、2つ目が「sample-bucket内のObjectに対する処理(例: GetObject)」と考えればよいようです。
こういったGUIクライアントを利用する際に、「ユーザに全部のバケットを見せたくない!特定のバケットのみ表示させるようにしたい!」という要望も頂くのですが、それは現状できないようです。
まとめ
GUIクライアント用のIAM Userを作成する際には、最低限「ListAllMyBuckets」と「GetBucketLocation」を付与してあげましょう。このブログでは特定のバケットに対する全権限を与えましたが、当然ReadOnly権限などに調整することができるので、いろいろと試してみましょう。IAMのPolicyを作成する際には、AWS Policy Generatorが非常に便利です。